package 多线程初阶.单例模式;

/**
 * 单例模式之懒汉模式:类加载的时候不创建实例,第一次使用的时候才创建实例
 * 这里演示的是单线程模式的懒汉模式,由于涉及到了读写,所以这是线程不安全的
 */
class SingleLazy {
    private static SingleLazy instance=null;
    private SingleLazy(){
    }
    public static SingleLazy getInstance() {
        if(instance==null){
            instance=new SingleLazy();
        }
        return instance;
    }
}

/**
 * 我们可以对它进行优化,通过加锁/双重if判断/volatile可以让他达到线程安全的效果
 * 加锁的作用规避了:如果在多个线程中同时调用 getInstance 方法, 就可能导致创建出多个实例
 * 双重if判断:减少了锁竞争的频率
 * volatile:规避instance"脏读"的情况
 */
class MultiLazy{
    private static volatile MultiLazy instance=null;
    private MultiLazy(){
    }
    public static MultiLazy getInstance() {
        if(instance==null){
            synchronized (MultiLazy.class){
                if(instance==null){
                    instance=new MultiLazy();
                }
            }
        }
        return instance;
    }
}







